第 2 课:版本管理
(一) Git 的三个区域
git 内分3个区域:工作区,暂存区,和本地仓库
工作区就是平时看到的文件目录,暂存区是上交时的缓存区域,本地仓库存储着所有的修改版本,需要用命令查看
工作区内的文件,必须先提交到缓存区,然后才能上传到仓库,可以多次提交到缓存区,然后一次性上传到仓库

git文件有4种状态

查看当前仓库的状态
git status
可以看到 test.py 还没有被放入缓存区
git add test.py

或者把当前文件夹下的所有文件都添加到暂存区
git add .
取消该文件的暂存
git rm --cached test.py
把缓存区的文件提交到本地仓库
git commit -m “first1”
-m参数后是 提交的注释内容

该命令可以同时完成暂存和提交,不需要再git add .
git commit -a -m "xxxxxx"
查看所有提交记录
git log
简洁版查看提交记录,(版本号+提交注释)
git log --oneline
查看暂存区文件
git ls-files
清楚暂存区的所有内容
git reset回退版本(按提交次数)
git reset --soft 版本ID
git reset --hard 版本ID (谨慎使用)
git reset --mixed 版本ID
git reset --mixed HEAD^HEAD^ 表示回退到上一个版本
途中×表示被删除,√表示保留
删除工作区和暂存区的该文件
git rm 文件名注意还要git commit一下,不然版本库的内容没有被删掉!
只删除暂存区,不删除工作区文件
git rm --cached 文件名
(二).gitignore
.gitignore 文件用于存储不应该被纳入版本库的文件

echo 文件名 > .gitignore
(不需要加引号)
这样再 commit 时,该文件就不会被提交到版本库中
注意:该文件不能事先已经提交到版本库中,否则 .gitignore 失效
忽略所有日志文件
echo *.log > .gitingore
也可以直接修改.gitignore 文件。
如图就是要忽略的内容。其中temp文件夹下的所有文件都被忽略。


示例:

注意:在github上有各种语言的默认 .gitignore 模板
(三)同步远程仓库
我们需要同步本地仓库和远程仓库
我们在第二步中已经克隆好了远程仓库

注意要进入Heihe-CS-learning那个文件夹!在外面是连接不到的!
我们先把test.py传到本地仓库

把所有本地仓库的内容推送给远程仓库
git push
此时就可以查看了

从远程仓库下载文件
git pull
默认是 git pull 仓库名 main分支
(四)分支

查看当前仓库的所有分支
git branch

前面带有*号的就是当前分支
创建新的分支,切换到新分支
git branch 新分支名
git switch 新分支名
如果新分支的修改还没提交:
-
在新分支中时,ls 查看包括新添加的文件和主分支的文件
-
在主分支main中时,ls 不能查看新分支中的修改和新文件

要把分支合并,首先要切换到main分支
把新分支合并到当前分支(main分支)
git merge 新分支名
git会自动进行一次提交,所以提示信息里 会要求输入注释信息
合并之后上图的分支就会变成这样

查看分支图
git log --graph --oneline
合并分支后新分支并不会被删除,要删除需要使用下面这个命令
git branch -d 新分支名
但是这个删除命令只能在该分支被合并后执行,如果要在合并之前删除,需要
git branch -D 新分支名
(五)分支合并冲突解决
当两个分支同时修改了同一个文件的同一行时,合并会出现错误
比如两个分支同时修改了 main1.txt,在新分支中修改如下,并提交

在main分支中修改如下,并提交

在 “git merge 新分支名” 合并时,报错如下

查看冲突文件的列表
git status

可以看到是 main1.txt
查看冲突具体内容
git diff

等号上面是当前分支(main分支)中的修改内容,等号下面是新分支中修改的内容
所以我们要手工编辑这个文件
当再次打开 main1.txt 时,内容已经变成如下:

改成如下

保存退出,添加暂存并提交
由于之前的合并过程尚未完成,这里commit 提交完成后会自动完成合并
若要终止合并,需要预先使用命令:
git merge --abort
(六)另一种合并——变基
之前我们使用的merge进行合并分支,过程如下
merge过程必须要在main分支上进行

然而使用 rebase 命令可以在任意分支上进行合并
比如本来是这样的分支结构

如果在dev分支上进行合并,会变成

如果在main分支上进行合并,会变成

这是因为rebase会找到当前分支和另一个分支最近的祖先节点,然后把这一段移动到另一个分支的head指针上(可以用链表来理解)

把当前分支变基到另外一个分支
git rebase 另一个分支名
